<?php
/**
 * 页面显示类
 * @author z.En Wong
 * @version 2.0
 * @date 11/05/2009
 */




class JL_page extends stdClass {
	public $__items=null;
	public $__errors=null;
	public $display_dir=null;
	
	public $is_use_cache=false;
	public $cache_dir=null;

/**
 * 构造函数
 *
 */
	public function __construct(){
		$this->JL_page();
	}

/**
 * 兼容低版本PHP的构造函数
 *
 * @return jl_Page
 */
	public function JL_page(){

		$this->display_dir = DISPLAY_ROOT;
	}

/**
 * 显示页面
 *
 * @param String $template_name 模板名
 * @param Boolean,Int $zip_level 压缩等级,1-9为使用zlib的gzip压缩的等级,true为使用PHP内置的ob_gzhandler压缩,其他均为不压缩
 * @param Boolean $is_end 当页面显示结束后,是否执行后面的代码
 */
	public function display($template_name,$zip_level=false,$is_end=true){
		include_once(dirname(__FILE__).'/jl_html.lib.php');
		$__ITEMS=&$this->__items;
		$__ERRORS=&$this->__errors;
		$DISPLAY_DIR=&$this->display_dir;
		
		
		if (!$zip_level) { //如果是false,那么不压缩
			
			include(rtrim($DISPLAY_DIR,'/\\').'/'.$template_name);

		}else if ($zip_level === true) { //使用PHP内置的ob_gzhandler压缩页面
			
			ob_start('page_ob_gzhandler');

			include(rtrim($DISPLAY_DIR,'/\\').'/'.$template_name);
			
			ob_end_flush();
			
			//在这个方法里,虽然header已经送出,但后面的屏幕输入还是会显示出来,不知道为什么
			
		}else if ($zip_level > 0 && $zip_level < 10){ //使用GZIP压缩页面
			
			$GLOBALS['page_gzip_level'] = intval($zip_level); //取整数部分
			
			ob_start('page_gzip');

			include(rtrim($DISPLAY_DIR,'/\\').'/'.$template_name);

			ob_end_flush();
			
			//因为header已经发送出去,所以本行下面的代码虽然会全部执行,但屏幕输出将不会显示出来

		}else { //如果都不处理,就使用没有压缩的页面
			
			include(rtrim($DISPLAY_DIR,'/\\').'/'.$template_name);
		}

		
		$is_end && exit;
	}
	
	
	/**
	 * 将结果集保存到cache里
	 *
	 * @param unknown_type $res
	 * @return unknown
	 */
	public function cache_4db($res,$cache_file_name=null,$append_mod=false){
		$a=array();
		while ($row = mysql_fetch_assoc($res)) {
			$a[]=$row;
		}
		return $this->cache_build($a,$cache_file_name,$append_mod);
		
	}
	
	/**
	 * 将页面保存到cache里
	 *
	 * @param STRING $template_file_name
	 * @param STRING $cache_file_name
	 * @param BOOLEAN $append_mod
	 * @return unknown
	 */
	public function cache_4page($template_file_name,$cache_file_name=null,$append_mod=false){
		ob_start();
		
		$this->display($template_file_name,false);
		
		$ob_con=ob_get_contents();
		
		ob_end_clean();

		return $this->cache_build($ob_con,$cache_file_name,$append_mod);
			
	}
	
	
	/**
	 * 构造一个缓冲文件的通用方法
	 *
	 * @param unknown_type $content_data
	 * @param String $cache_file_name
	 * @param Boolean $append_mod 是否使用最加模式
	 * @return unknown
	 */
	public function cache_build($content_data,$cache_file_name=null,$append_mod=false){
		
		if (empty($cache_file_name)) {
			
			$cache_file_name=str_replace('.','_',microtime(true));
		}
		
		$file = rtrim($this->cache_dir,'/\\').'/'.trim($cache_file_name,'/\\').'.cac';
		
		if ($append_mod) {
			file_put_contents($file,serialize($content_data),FILE_APPEND);
		}else{
			file_put_contents($file,serialize($content_data));
		}
		
		return $file;
		
	}
	
	public function cache_read($cache_file_name){
		return unserialize(file_get_contents(rtrim($this->cache_dir,'/\\').'/'.trim($cache_file_name,'/\\')));		

	}
	
	
	public function set_item($item_name=null,$item_value){
		if (empty($item_name) && is_array($item_value)) {
			foreach ($item_value as $key=>$value){
				
				$this->__items[$key]=$value;
				
			}
			
		}else if(!empty($item_name)){
			
			$this->__items[$item_name]=&$item_value;
		}
	}
	
	public function set_error($error_name=null,$error_value){
		if (empty($error_name) && is_array($error_value)) {
			foreach ($error_value as $key=>$value){

				$this->__errors[$key]=$value;				
			}
		}else if(!empty($error_name)){
			
			$this->__errors[$error_name]=&$error_value;
		}
	}
	
	public function get_error($error_name=''){
		if (empty($error_name)) {
			return $this->__errors;
		}
		return $this->__errors[$error_name];
	}
	
	public function set_display_dir($display_dir){
		$this->display_dir=$display_dir;
	}
	public function set_cache_dir($cache_dir){
		$this->cache_dir=$cache_dir;
	}

}


/**
 * 页面压缩方法
 * 
 *
 * @param String $content 要压缩的内容
 * @return String 压缩后的内容
 */
function page_gzip($content) // $content 就是要压缩的页面内容
{
	$GLOBALS['test']=1;
	if( !headers_sent() && // 如果页面头部信息还没有输出
	extension_loaded("zlib") && // 而且zlib扩展已经加载到PHP中
	strstr($_SERVER["HTTP_ACCEPT_ENCODING"],"gzip")) //而且浏览器说它可以接受GZIP的页面
	{
	$content = gzencode($content,$GLOBALS['page_gzip_level']); //用zlib提供的gzencode()函数执行级别为9的压缩，这个参数值范围是0-9，0表示无压缩，9表示最大压缩，当然压缩程度越高越费CPU。
	
	//然后用header()函数给浏览器发送一些头部信息，告诉浏览器这个页面已经用GZIP压缩过了！
	header("Content-Encoding: gzip");
	header("Vary: Accept-Encoding");
	header("Content-Length: ".strlen($content));
	}
	return $content; //返回压缩后的内容
}

/**
 * PHP内置的压缩函数的包装函数
 * 
 *
 * @param String $content 要压缩的内容
 * @return String 压缩后的内容
 */
function page_ob_gzhandler($content){ // PHP内置的压缩函数的包装函数
	
	$content = ob_gzhandler($content,PHP_OUTPUT_HANDLER_START);

	header("Content-Length: ".strlen($content));
	
	return $content;
}


?>
